﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ForrajeriaDAL;
using ForrajeriaDB;
using System.Transactions;
using System.Data;

namespace ForrajeriaBCL
{
    public class FacturaBCL : InterfaceBCL<FacturaMO>
    {
        private FacturaDAL facturaDAL;
        
        private GenericDAL genericDAL = GenericDAL.getInstance;
        private DetallePedidoClienteDAL detallePedidoClienteDAL = DetallePedidoClienteDAL.getInstance;
        public FacturaBCL()
        {
            facturaDAL = FacturaDAL.Instance; //consumiendo patron SINGLETON
        }

        public DataTable reporteVentasEmpleado(DateTime fecha, string ordena, string dire)
        {
            try 
            {
                return facturaDAL.reporteVentasEmpleado(fecha,ordena,dire);
            }
           
            catch(Exception ex)
            {
                    throw ex;
            }
        }
        public List<FacturaMO> GetAll()
        {
            try
            {

                return facturaDAL.GetAll();
            }
            catch (Exception ex)
            {
                Exception ez = new Exception("Error de conexion con la Base de Datos");
                throw (ez);
            }
        }

        

        public string Adicionar(FacturaMO item)
        {
            throw new NotImplementedException();
        }

        public string Eliminar(FacturaMO item)
        {
            throw new NotImplementedException();
        }

        public string Actualizar(FacturaMO itemNuevo, FacturaMO itemViejo)
        {
            throw new NotImplementedException();
        }

        public List<GenericMO> ClientesGetALL()
        {
            try
            {
                return genericDAL.GetAllClientes();
            }
            catch (Exception ex)
            {
                Exception ez = new Exception("Error de conexion con la Base de Datos");
                throw (ez);
            }
        }

        public List<GenericMO> ForrajesGetALL()
        {
            try
            {
                return genericDAL.GetAllForrajes();
            }
            catch (Exception ex)
            {
                Exception ez = new Exception("Error de conexion con la Base de Datos");
                throw (ez);
            }
        }

        public List<GenericMO> DetallePedidoCliente(int idPedido)
        {
            try
            {
                return genericDAL.GetDetallesPedidosByID(idPedido);
            }
            catch (Exception ex)
            {
                throw new Exception("Error de coneccion a la Base de Datos");
            }
        }

        public DataTable DetallePedidoCliente2(int idPedido)
        {
            try
            {
                return detallePedidoClienteDAL.GetDetallesPedidosPorID(idPedido);
            }
            catch (Exception ex)
            {
                throw new Exception("Error de coneccion a la Base de Datos");
            }
        }

        public bool AdicionarFactura(FacturaMO factura, List<DetalleFacturaMO> detalleFactura)
        {
            try
            {
                using (TransactionScope tra = new TransactionScope())
                {

                    int codigoFactura = facturaDAL.AdicionarConRetorno(factura);


                    ForrajeDAL obForraje = ForrajeDAL.Instance;
                    List<ForrajeMO> listaForrajes = obForraje.GetAll();


                    if (factura.NroPedido != null)
                    {
                        PedidoClienteDAL pedidoClienteDAL =PedidoClienteDAL.getInstance;
                        pedidoClienteDAL.ActualizarEstado((int)factura.NroPedido, "C");

                        DetallePedidoClienteDAL DetalleClienteDAL = DetallePedidoClienteDAL.getInstance;
                        List<DetallePedidoClienteMO> listaDetallePedido = DetalleClienteDAL.getByNroPedido(factura.NroPedido.Value);

                        foreach (DetallePedidoClienteMO pedido in listaDetallePedido)
                        {
                            foreach (ForrajeMO forraje in listaForrajes)
                            {
                                if (forraje.CodigoForraje == pedido.CodigoForraje)
                                {
                                    forraje.StockActual = forraje.StockActual - pedido.Cantidad;
                                }
                            }
                        }

                    }

                    int codigolinea = 1;
                    DetalleFacturaDAL objDetalleDAL = DetalleFacturaDAL.Instance;
                    foreach (DetalleFacturaMO detalle in detalleFactura)
                    {
                        detalle.NroFactura = codigoFactura;
                        detalle.NroLinea = codigolinea;
                        foreach (ForrajeMO forraje in listaForrajes)
                        {
                            if (forraje.CodigoForraje == detalle.Forraje)
                            {
                                forraje.StockActual = forraje.StockActual - detalle.Cantidad;
                            }

                        }
                        objDetalleDAL.Adicionar(detalle);

                        codigolinea += codigolinea;
                    }

                    ForrajeBCL objBCLForraje = new ForrajeBCL();
                    objBCLForraje.modificarStock(listaForrajes);


                    tra.Complete();
                    return true;
                }


            }

            catch (Exception ex)
            {
                throw new Exception("Error de Escritura En Base de Datos");
            }
            
            
        }

        public DataTable reporteVentasDelDia(DateTime fecha, string columna="", string dire="")
        {
            try
            {
                return facturaDAL.reporteVentasDelDia(fecha, columna, dire);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        public DataTable DetalleReporteFactura(int nro)
        {
            try
            {
                return facturaDAL.reporteDetalleFactura(nro);
            }
            catch(Exception ex)
            {
                throw ex;
            }

        }

        public List<FacturaMO> buscarFacturas(string p, int empleado, DateTime desde, DateTime hasta)
        {
            try
            {
                return facturaDAL.buscarFacturas(p,empleado,desde,hasta);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }
}
